{{tag>système administration services}}
----

====== Systemd ======
Systemd est le gestionnaire de système qui remplace [[:upstart]] et son prédécesseur ([[:script_sysV|les scripts system V]]) depuis [[:xenial|Ubuntu 16.04 LTS Xenial]]. Le nom de ce programme vient de « system daemon » : le daemon du système\\
 FIXME **Est-ce vraiment à partir de Ubuntu 16.04 ? Ou est-ce antérieur ?**\\
C'est une pièce maîtresse de l'architecture [[:GNU]]/[[:Linux]]. En effet, c'est le premier programme lancé par le noyau (il a donc le PID N°1) et il se charge de lancer tous les programmes suivants en ordre jusqu'à obtenir un système opérationnel pour l'utilisateur, selon le mode déterminé (single user, multi-user, graphique). C'est également à lui qu'incombe la tache de redémarrer ou arrêter votre ordinateur proprement.

<note warning>On comprendra aisément à partie de cette introduction qu'il faut être très prudent lorsque l'on touche à la configuration de systemd. Une mauvaise manipulation peut rendre votre système instable, voir inopérationnel.</note>

Il a été développé dans l'optique de mieux gérer les dépendances entre les différents services lancés au démarrage et optimiser celui-ci en parallélisant mieux les tâches. Son rôle est plus étendu que [[:Upstart]], il gère également le [[:montage]] des différents [[:systeme_de_fichiers|systèmes de fichier]] et introduit un nouveau système de log appelé "The Journal".\\

Il introduit la notion d'unité. Une unité représente un fichier de configuration. Entre autres, une unité peut être un service (*.service), un target (*.target), un montage (*.mount), un socket (*.socket)… \\
C'est donc un sujet très vaste et nous allons donc nous concentrer dans ce wiki sur un des aspects les plus important de système, la gestion des [[:services]]

=====Gestion basique des services=====
Un [[:services|service]] ou daemon est un programme qui tourne en arrière plan et s'active sous certaine condition. Par exemple, le service hddtemp surveille la température de vos disques dur et declanche une alerte si elle dépasse un certain seuil.\\
L'outil de gestion des [[:services]] (et des autres unités d'ailleurs) dans systemd s'appelle **systemctl**.\\
Il est généralement utilisé dans un [[:terminal]]:
<code>systemctl ACTION <Nom_du_service>.service</code>
Où  
  * ACTION sera la commande que l'on souhaite appliquer à la dite unité:
      * // start // : démarrer le service
      * // stop // : arrêter le service
      * // restart // : relancer le service
      * // reload // : recharger le service
      * // status // : connaitre l'état du service
  * <Nom_du_service> est le nom du service visé.
 
Quelle que soit l'action menée sur un service, au prochain démarrage de la machine celui-ci devrait retrouver le status qui lui a été [[#Modifier l'exécution d'un service|défini par défaut]]. 
<note>Il n'est pas nécessaire d'utiliser sudo devant ces commandes. Systemctl vous demandera votre mot de passe root en cas de besoin (presque à chaque fois, donc)</note>

===Exemples===

<code>systemctl status ssh.service</code>donnera l'état du service [[:ssh]], son PID et les dernières lignes de son fichier de log. 
<code>systemctl stop ufw.service</code> arrêtera le service [[:ufw]], Uncomplicated Firewall,
<code>systemctl restart lightdm.service</code> relancera le serveur graphique.\\

<note>Afin de conserver une compatibilité avec les anciens [[:script_sysV|scripts system V]], des liens vers les commandes principales de systemctl sont installés par défaut. Il s'agit de //start//,// stop//,// restart //et //status//.\\
Par exemple **sudo restart lightdm** est équivalent à **systelctl restart lightdm.service**.</note>


=====Lister les services démarrés=====

Pour obtenir la liste triée des services accompagnés de leur état, saisissez dans un [[:terminal]] :
<code>systemctl list-unit-files | grep service | sort </code>

Vous pouvez également obtenir la liste des services lancés au démarrage, triés selon leur temps d’exécution :
<code>systemd-analyze blame</code>
Cela peut-être pratique pour trouver le service qui ralenti votre démarrage.

=====Modifier l'exécution d'un service=====

Comme [[:Upstart]], systemd utilise des fichiers de configuration correspondant aux différents services à manipuler.\\
Ces fichiers de configuration se trouvent dans **/etc/systemd/system/** et permettent d'indiquer les conditions d'activation ou désactivation d'un service, leur propriétaire, etc.
<note important>Ce dossier étant essentiel au bon fonctionnement de votre système, il est conseillé d'en faire une sauvegarde avant toute modification de fichier.\\
Dans un [[:terminal]] saisissez:
<code>sudo cp -r /etc/systemd/system /etc/systemd/system.save$(date +%Y%m%d)</code></note>

Pour desactiver un service, il faut taper :
<code>systemctl disable <Nom_du_service>.service</code>
Ainsi, au prochain redemarrage du système, le service correspondant ne sera plus lancé.\\

Pour activer un service ou relire sont fichier de configuration, il faut taper:
<code>systemctl enable <Nom_du_service>.service</code>

Néanmoins si vous souhaitez modifier l'état d'un service selon certaines conditions, vous devrez [[:tutoriel:comment_modifier_un_fichier|modifier ou créer le fichier]] **/etc/systemd/system/<nom_du_service>.service**. Les fichiers de configuration par défaut se trouvent dans **/lib/systemd/system/**\\

===Exemples===
Si vous souhaitez désactiver la [[:synchronisation]] des fichiers [[:syncthing]] de l'utilisateur toto, dans un [[:terminal]] saisissez:
<code>systemctl disable syncthing@toto.service</code>
Pour réactiver le service, il faudra faire la manipulation inverse:
<code>systemctl enable syncthing@toto.service</code>

===== Les targets =====
 
Systemd introduit la notion de target au sein de ses unités. Une target permet de regrouper dans un seul paquet plusieurs autres unités et de retrouver la notion de runlevel ([[:script_sysV|des scripts system V]]).\\

===Tableau de correspondance ===

^ Runlevel 	^ Systemd Target 								^ Notes 										^
| 0 			| runlevel0.target, poweroff.target 					| Arrête le système 								|
| 1 			| runlevel1.target, rescue.target 					| Mode single user 								|
| 3 			| runlevel3.target, multi-user.target 					| Mode multi-utilisateur, non graphique				|
| 2, 4 		| runlevel2.target, runlevel4.target, multi-user.target 	| Mode défini par l'utilisateur, identique au 3 par défaut.	|
| 5 			| runlevel5.target, graphical.target 					| Mode graphique multi-utilisateur 					|
| 6 			| runlevel6.target, reboot.target 					| Redémarre									|
| emergency 	| emergency.target 								| Shell d'urgence 								|

===Gérer l'état de votre ordinateur ===
Pour changer de target, on utilise la commande **isolate** de **systemctl**. Par exemple, pour passer en mode multi-utilisateur non graphique, il faut taper dans un [[:terminal]]:
<code>systemctl isolate multi-user.target</code>
ou son équivalent selon le tableau ci-dessus :
<code>systemctl isolate runlevel3.target</code>
ou son equivalent dans le [[:script_sysV|system V]]
<code>telinit 3</code>

C'est donc systemd qui gère le démarrage, l’arrêt ou encore le redémarrage de l'ordinateur. En fait, lorsque vous tapez dans un [[:terminal]] :
<code>sudo reboot</code>
Vous appelez la commande:
<code>sudo systemctl reboot</code>

Vous pouvez utilisez d'autre commande pour gérer l'état de votre ordinateur (dans l'ordre, éteindre / mettre en veille / hiberner) :
<code>
systemctl poweroff
systemctl suspend
systemctl hibernate
</code>

Enfin, vous pouvez définir le target par défaut au démarrage en tapant :
<code>systemctl set-default -f multi-user.target</code>
Votre ordinateur démarrera désormais en mode multi-utilisateur sans mode graphique.\\

===Infos sur les targets ===
Pour connaitre la liste des targets configurés sur votre ordinateur, tapez dans un [[:terminal]] :
<code>systemctl list-unit-files | grep target </code>

Pour savoir quelles unités sont regroupés au sein d'une target, tapez :
<code>systemctl show -p Wants -p Requires <target></code>


===== Personnaliser un fichier de configuration Systemd=====

FIXME **Cette section reste à ecrire !!!**

Pour connaitre les dépendances d'une unité, tapez dans un [[:terminal]]:
<code>systemctl list-dependencies [<unit>] </code>

===== Les journaux =====
systemd possède son propre mécanisme de journalisation, appelé "The Journal".

Pour accéder au log, tapez dans un [[:terminal]] :
<code>journalctl</code>

Pour une gestion plus fine, vous pouvez consulter les messages d'un seul service par son //nom//, son //PID// ou même son //exécutable// :
<code>journalctl -u wicd
journalctl _PID=1
journalctl /usr/sbin/dhcpcd
</code>

<note tip>Lorsque vous consultez le ''status'' d'un service avec la commande ''systemctl status <nom_du_service>'', systemd vous affiches quelques lignes des logs les plus recents</note>

journalctl permet aussi de filtrer par le niveau de log (tel que défini par syslog). Pour n'afficher que les erreurs :

<code>journalctl -p err</code>
=====Logiciels graphique=====

Il existe un utilitaire graphique qui se nomme **systemadm** pour gérer systemd.
Pour l'installer, tapez dans un [[:terminal]]:
<code> sudo apt-get install systemd-ui</code>

Il existe également un logiciel graphique nommé **Gnome-logs** pour lire les fichiers de log generés par systemd.
Pour l'installer, tapez dans un [[:terminal]]:
<code> sudo apt-get install gnome-logs</code>
 
===== Ressources ======
  * [[https://fr.wikipedia.org/wiki/Systemd|systemd]] sur Wikipedia en français
  * [[http://casteyde.christian.free.fr/system/linux/guide/index.html|YAGIL]] Yet Another « Guide d'installation de Linux » de Christian Casteyde. Pour tout savoir sur le fonctionnement de GNU / Linux.

----
//Contributeurs: [[:utilisateurs:zarmu]],//